package io.github.annyylxyms.gyncache.core;

/**
 * Command interface
 * @author Anny
 * @date 2025/1/3 16:34
 */
public interface Command {
    String CRLF = "\r\n";
    String OK =  "OK";

    String name();

    Reply<?> exec(GynCache cache, String[] args);

    //add default args operator .提取在接口中作为公共的部分，避免频繁操作数组的指定位置，变成明确的有语义的东西。
    default String getKey(String[] args) {
        return args[4];
    }
    default String getVal(String[] args) {
        return args[6];
    }

    default String getValue(String[] args) {
        return args[6];
    }

    /**
     * 比如 mget key1 key2 key3
     * 这里取所有的key的数组
     * key 以外的其他所有参数
     * @param args
     * @return
     */
    default String[] getParams(String[] args) {
        int len = (args.length - 3) / 2;
        String[] keys = new String[len];
        for (int i = 0; i < len; i++) {
            keys[i] = args[4 + i * 2];
        }
        return keys;
    }

    /**
     * 拿到除了key以外的其他所有的参数
     * @param args
     * @return
     */
    default String[] getParamsNoKey(String[] args) {
        int len = (args.length - 5) / 2;
        String[] keys = new String[len];
        for (int i = 0; i < len; i++) {
            keys[i] = args[6 + i * 2];
        }
        return keys;
    }

    /**
     * 比如 mset key1 val1 key2 val2 key3 val3
     * 此方法返回所有的val的集合
     * @param args
     * @return
     */
    default String[] getVals(String[] args) {
        int len = (args.length - 3) / 4;
        String[] vals = new String[len];
        for (int i = 0; i < len; i++) {
            vals[i] = args[6 + i * 4];
        }
        return vals;
    }

    /**
     * 比如 mset key1 val1 key2 val2 key3 val3
     * 此方法返回所有的key的集合
     * @param args
     * @return
     */
    default String[] getKeys(String[] args) {
        int len = (args.length - 3) / 4;
        String[] keys = new String[len];
        for (int i = 0; i < len; i++) {
            keys[i] = args[4 + i * 4];
        }
        return keys;
    }

    default String[] getHvals(String[] args) {
        int len = (args.length - 5) / 4;
        String[] vals = new String[len];
        for (int i = 0; i < len; i++) {
            vals[i] = args[8 + i * 4];
        }
        return vals;
    }

    /**
     * 假设有一个哈希表 user:1000，其中包含以下字段和值：
     * name = "Alice"
     * age = 30
     * gender = "female"
     * 执行命令：HMGET user:1000 name age
     * 返回结果：
     * 1) "Alice"
     * 2) "30"
     * @param args
     * @return
     */
    default String[] getHkeys(String[] args) {
        // hset myhash key1 val1 key2 val2 key3 val3
        // 比较 mset 的方法，多了一个 5，所以需要减去 5，除以 4（key占2个，val占2个，所以每4个有一个key），得到key数组的长度，为了初始化一个key的数组。
        int len = (args.length - 5) / 4;
        String[] keys = new String[len];
        for (int i = 0; i < len; i++) {
            keys[i] = args[6 + i * 4];
        }
        return keys;
    }

}
